package com.example.sprintboot_demo1.listener;

import jakarta.servlet.annotation.WebListener;
import jakarta.servlet.http.HttpSession;
import jakarta.servlet.http.HttpSessionEvent;
import jakarta.servlet.http.HttpSessionListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * 自定义Session监听器
 * 监听HttpSession的创建和销毁事件
 */
@Component
@WebListener
public class MySessionListener implements HttpSessionListener {

    private static final Logger log = LoggerFactory.getLogger(MySessionListener.class);
    
    // 用于统计在线用户数
    private static final AtomicInteger onlineUserCount = new AtomicInteger(0);

    /**
     * Session创建时调用
     * @param se HttpSession事件对象
     */
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        HttpSession session = se.getSession();
        int currentCount = onlineUserCount.incrementAndGet();
        
        log.info("=== Session创建 ===");
        log.info("Session ID: {}", session.getId());
        log.info("Session创建时间: {}", new java.util.Date(session.getCreationTime()));
        log.info("Session最大非活跃时间: {} 秒", session.getMaxInactiveInterval());
        log.info("当前在线用户数: {}", currentCount);
        
        // 设置Session属性
        session.setAttribute("createTime", System.currentTimeMillis());
        session.setAttribute("userAgent", "Unknown"); // 可以从request中获取
        
        log.info("=== Session创建完成 ===");
    }

    /**
     * Session销毁时调用
     * @param se HttpSession事件对象
     */
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        HttpSession session = se.getSession();
        int currentCount = onlineUserCount.decrementAndGet();
        
        log.info("=== Session销毁 ===");
        log.info("Session ID: {}", session.getId());
        
        // 计算Session存活时间
        Long createTime = (Long) session.getAttribute("createTime");
        if (createTime != null) {
            long lifeTime = System.currentTimeMillis() - createTime;
            log.info("Session存活时间: {} 秒", lifeTime / 1000);
        }
        
        log.info("Session最后访问时间: {}", new java.util.Date(session.getLastAccessedTime()));
        log.info("当前在线用户数: {}", currentCount);
        
        // 清理Session相关资源
        // 比如清理用户缓存、记录用户行为日志等
        
        log.info("=== Session销毁完成 ===");
    }
    
    /**
     * 获取当前在线用户数
     * @return 在线用户数
     */
    public static int getOnlineUserCount() {
        return onlineUserCount.get();
    }
}
